home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / zugabe / va45 / visual45 / library / extend / objcedit.s < prev    next >
Text File  |  1998-09-06  |  20KB  |  834 lines

  1. ;------------------------------------------------------------------------------
  2. ; Method name : -
  3. ; Asm label   : GWVA_WFORM_PRG_OBJC_EDIT
  4. ; Description : Réécriture de la fonction AES objc_edit
  5. ;
  6. ; in  : a0.l = adresse de l'arbre ressource
  7. ; in  : d0.w = numéro de l'objet qui a le focus d'édition
  8. ; in  : d1.w = touche à traiter (venant d'un form_keybd)
  9. ; in  : d2.w = index courant de la position du curseur dans le champ texte
  10. ; in  : d3.w = mode (1,2,3) + mode étendu (4,5=4 moins le curseur)
  11. ; out : -> retour dans les int_out (compatibilité pour le retour)
  12. ; out : int_out+1*2 : nouvelle position curseur
  13. ; out : int_out+2*2 : état de sortie : bit 0 : sortie caractère à droite,
  14. ;               bit 1 : rentrée caractère à droite,
  15. ;               bit 2 : sortie curseur à droite,
  16. ;               bit 3 : sortie curseur à gauche.
  17. ; out : int_out+3*2 : caractère éventuel en sortie, 0.w sinon
  18. ;
  19. ; 22/08/98 : Création
  20. ;------------------------------------------------------------------------------
  21. GWVA_WFORM_PRG_OBJC_EDIT:
  22.  
  23.     clr.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE
  24.     clr.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_CHAR
  25.  
  26.     tst d3
  27.     ble .pas_un_mode_valide
  28.     cmp.w #4,d3
  29.     bgt .pas_un_mode_valide
  30.  
  31.     move.w d0,d4
  32.     mulu #L_OBJECT,d4
  33.     lea (a0,d4.l),a2
  34.  
  35.     move.w ob_type(a2),d4
  36.     and.w #$ff,d4
  37.     cmp.w #G_FTEXT,d4
  38.     beq.s .texte_editable
  39.     cmp.w #G_FBOXTEXT,d4
  40.     bne.s .pas_texte_editable_connu
  41. .texte_editable:
  42.  
  43.     move.l ob_spec(a2),a1
  44.  
  45.  
  46.     cmp.w #3,d3
  47.     beq .efface_curseur        ; on peut effacer le curseur d'un objet
  48.                 ; FTEXT disable (changement d'état)
  49.     btst #EDITABLE,ob_flags+1(a2)
  50.     beq.s .pas_objet_editable
  51.     btst #DISABLED,ob_state+1(a2)
  52.     bne.s .objet_disable
  53.  
  54.     cmp.w #1,d3
  55.     beq .affiche_curseur
  56.  
  57.     move.w d3,GWVA_WFORM_OBJ_OBJC_EDIT_MODE    ; l'objc_edit est réentrant, mais
  58.  
  59.     cmp.w #2,d3
  60.     beq.s .traite_touche
  61.     cmp.w #4,d3
  62.     beq.s .traite_touche_speciale
  63.  
  64.     clr.w int_out+3*2
  65.     move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_CHAR,int_out+3*2+1
  66.     clr.w int_out+2*2
  67.     move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE,int_out+2*2+1
  68.  
  69.     move.w d2,int_out+1*2
  70.     move.w #1,d0
  71.     move.w d0,int_out
  72.     rts
  73.  
  74. .objet_disable:
  75. .pas_objet_editable:
  76. .pas_texte_editable_connu:
  77. .pas_un_mode_valide:
  78. .pas_de_curseur_affiche:
  79. .pas_touche_ascii:
  80. .unknown_char:
  81.  
  82.     clr.w int_out+3*2
  83.     move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_CHAR,int_out+3*2+1
  84.     clr.w int_out+2*2
  85.     move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE,int_out+2*2+1
  86.  
  87.     move.w d2,int_out+1*2
  88.     move.w #0,d0
  89.     move.w d0,int_out
  90.     rts
  91.  
  92.     *-----------------------*
  93.  
  94. .traite_touche_speciale:
  95. .traite_touche:
  96.     move.w #-1,d3    ; d3 : sens du déplacement
  97.     cmp.w #$4b00,d1    ; flêche gauche
  98.     beq .deplacement_curseur
  99.  
  100.     move.w #1,d3
  101.     cmp.w #$4d00,d1    ; flêche droite
  102.     beq .deplacement_curseur
  103.  
  104.     cmp.w #$011b,d1    ; Esc
  105.     beq .touche_escape
  106.  
  107.     cmp.w #$0e08,d1    ; Backspace
  108.     beq .touche_backspace
  109.  
  110.     cmp.w #$537f,d1    ; Del
  111.     beq .touche_del
  112.  
  113.     tst.b d1
  114.     beq.s .pas_touche_ascii
  115. ; C'est une touche normale
  116.  
  117.     save.l d0-d1/a0-a2
  118.  
  119.     move.l a2,a0    ; objet
  120.     move.b d1,d0    ; charactère
  121.     move.w d2,d1    ; position d'insertion
  122.     move.w d2,GWVA_WFORM_OBJ_CURSOR_POS_TEXT    ; position curseur à effacer
  123.  
  124.     move.w GWVA_WFORM_OBJ_OBJC_EDIT_MODE,d2
  125.     bsr GWVA_WFORM_PRG_INSERT_CHAR_IN_EDITABLE_TEXT
  126.     move.b d1,GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE    ; condition de sortie
  127.     move.b d2,GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_CHAR    ; caractère éventuel en sortie
  128.     move.w d0,d2    ; d2.w nouvelle position curseur
  129.     load.l d0-d1/a0-a2
  130.  
  131.     tst.w d7
  132.     bne.s .pas_insertion_char
  133.  
  134.     bsr .affichage_champ_texte
  135.     move.w int_out+1*2,d2
  136. .pas_insertion_char;
  137.  
  138. .pas_del_possible:
  139. .pas_backspace_possible:
  140.  
  141.     clr.w int_out+3*2
  142.     move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_CHAR,int_out+3*2+1
  143.     clr.w int_out+2*2
  144.     move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE,int_out+2*2+1
  145.  
  146.     move.w d2,int_out+1*2
  147.     move.w #1,d0
  148.     move.w d0,int_out
  149.     rts
  150.  
  151. .touche_del:
  152.     move.w d2,GWVA_WFORM_OBJ_CURSOR_POS_TEXT    ; position curseur à effacer
  153.  
  154.     move.l te_ptext(a1),a3
  155.     move.l a3,a4
  156.  
  157.     add.w d2,a3
  158.     tst.b (a3)
  159.     beq .pas_del_possible        ; fin du texte éditable
  160.  
  161.     STOP_ON_0 a4
  162.     sub.l te_ptext(a1),a4
  163.     move.w a4,d3
  164.     add.w #1,d3        ; longueur du texte éditable
  165.  
  166.     move.b (a3),d4    ; caractère effacé par le del
  167. *    clr.w d4        ; caractère effacé par le del
  168.  
  169.     cmp.w te_txtlen(a1),d3
  170.     bne.s .pas_entree_caractere_droite
  171.  
  172.     cmp.w #4,GWVA_WFORM_OBJ_OBJC_EDIT_MODE
  173.     bne.s .pas_mode_speciale4_3
  174.     bset #1,GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE    ; entrée à droite
  175. .pas_mode_speciale4_3:
  176.  
  177. .pas_entree_caractere_droite:
  178.  
  179. .decalage_char_del:
  180.     move.b 1(a3),(a3)+
  181.     tst.b (a3)
  182.     bne.s .decalage_char_del
  183.  
  184.     move.b d4,GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_CHAR
  185.  
  186. ; pas de changement de position du curseur
  187.  
  188.     bsr .affichage_champ_texte
  189.  
  190.     clr.w int_out+3*2
  191.     move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_CHAR,int_out+3*2+1
  192.     clr.w int_out+2*2
  193.     move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE,int_out+2*2+1
  194.     move.w #1,d0
  195.     move.w d0,int_out
  196.     rts
  197.  
  198. .touche_backspace:
  199.     move.w d2,GWVA_WFORM_OBJ_CURSOR_POS_TEXT    ; position curseur à effacer
  200.  
  201.     tst.w d2
  202.     beq.s .test_obj_edit_extd_backspace
  203.  
  204.     move.l te_ptext(a1),a3
  205.     move.l a3,a4
  206.  
  207.     add.w d2,a3
  208.     sub.w #1,a3
  209.  
  210.     STOP_ON_0 a4
  211.     sub.l te_ptext(a1),a4
  212.     move.w a4,d3
  213.     add.w #1,d3        ; longueur du texte éditable
  214.  
  215.     cmp.w te_txtlen(a1),d3
  216.     bne.s .pas_entree_caractere_droite2
  217.  
  218.     cmp.w #4,GWVA_WFORM_OBJ_OBJC_EDIT_MODE
  219.     bne.s .pas_mode_speciale4_5
  220.     bset #1,GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE    ; entrée à droite
  221. .pas_mode_speciale4_5:
  222.  
  223. .pas_entree_caractere_droite2:
  224.  
  225. .decalage_char_backspace:
  226.     move.b 1(a3),(a3)+
  227.     tst.b (a3)
  228.     bne.s .decalage_char_backspace
  229.  
  230.     sub.w #1,d2        ; on recule le curseur
  231.  
  232.     bsr .affichage_champ_texte
  233.  
  234.     clr.w int_out+3*2
  235.     clr.w int_out+2*2
  236.     move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE,int_out+2*2+1
  237.     move.w #1,d0
  238.     move.w d0,int_out
  239.     rts
  240. .test_obj_edit_extd_backspace:
  241.     cmp.w #4,GWVA_WFORM_OBJ_OBJC_EDIT_MODE
  242.     bne .pas_backspace_possible
  243.  
  244.     move.w d1,int_out+3*2    ; bakspace en sortie
  245.     clr.w int_out+2*2
  246.     bset #3,int_out+2*2+1    ; le curseur sort à gauche
  247.     bset #1,int_out+2*2+1    ; un caractère doit rentrer à droite du champ précédent
  248.     move.w d2,int_out+1*2
  249.     move.w #1,d0
  250.     move.w d0,int_out
  251.     rts
  252.  
  253. .touche_escape:
  254.     move.l te_ptext(a1),a3        ; pour vider le champ, on place un 0.b en début
  255.     clr.b (a3)
  256.     move.w d2,GWVA_WFORM_OBJ_CURSOR_POS_TEXT    ; position curseur à effacer
  257.  
  258.     moveq #0,d2            ; position du curseur 
  259.     bsr .affichage_champ_texte    ; int_out+1*2 bien positioné pour le curseur
  260.  
  261.     clr.w int_out+3*2
  262.     clr.w int_out+2*2
  263.     move.w #1,d0
  264.     move.w d0,int_out
  265.     rts
  266.  
  267. .affichage_champ_texte:
  268.  
  269.     save.l d0/d2/a0-a2
  270.  
  271.     cmp.w #4,GWVA_WFORM_OBJ_OBJC_EDIT_MODE
  272.     beq.s .pas_effacement_curseur_en_mode_4
  273.  
  274.     movem.l (sp),d0/d2/a0-a2
  275.  
  276.     move.w GWVA_WFORM_OBJ_CURSOR_POS_TEXT,d2    ; position curseur à effacer
  277.     move.w #3,d3
  278.     bsr GWVA_WFORM_PRG_OBJC_EDIT        ; efface curseur
  279. .pas_effacement_curseur_en_mode_4:
  280.  
  281.     wind_update #BEG_UPDATE
  282.     graf_mouse #M_OFF
  283.  
  284.     movem.l (sp),d0/d2/a0-a2
  285.  
  286.     objc_offset a0,d0            ; position de l'objet
  287.     movem.l (sp),d0/d2/a0-a2
  288.     objc_draw a0,d0,#1,int_out+1*2,int_out+2*2,ob_width(a2),ob_height(a2)    ; affichage de l'objet texte
  289.  
  290.     graf_mouse #M_ON
  291.     wind_update #END_UPDATE
  292.  
  293.     load.l d0/d2/a0-a2
  294.  
  295.     cmp.w #4,GWVA_WFORM_OBJ_OBJC_EDIT_MODE
  296.     beq.s .pas_affichage_curseur_en_mode_4
  297.  
  298.     ; numéro de l'objet contenant le curseur dans d0.w
  299.     ; position du cuseur dans d2.w
  300.     move.l te_ptext(a1),a3        ; pour positionner le curseur, on place un 0.b
  301.     add.w d2,a3
  302.     move.b (a3),-(sp)
  303.     clr.b (a3)
  304.     save.l a3
  305.     move.w #1,d3        ; on affiche le curseur
  306.     bsr GWVA_WFORM_PRG_OBJC_EDIT
  307.     load.l a3
  308.     move.b (sp)+,(a3)
  309.  
  310.     move.w int_out+1*2,d2        ; position du curseur dans le champ éditable
  311.  
  312. .pas_affichage_curseur_en_mode_4
  313.  
  314.     move.w #1,d0
  315.     move.w d0,int_out
  316.     move.w d2,int_out+1*2        ; position du curseur
  317.     rts
  318.  
  319. .deplacement_curseur:
  320.     move.w d2,GWVA_WFORM_OBJ_CURSOR_POS_TEXT    ; position curseur à effacer
  321.  
  322.     add.w d3,d2
  323.     bpl.s .position_positive
  324.  
  325.     cmp.w #4,GWVA_WFORM_OBJ_OBJC_EDIT_MODE
  326.     bne.s .pas_mode_speciale4_1
  327.     bset #3,GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE    ; sortie à gauche
  328. .pas_mode_speciale4_1:
  329.  
  330.     moveq #0,d2
  331.  
  332. .position_positive:
  333.     save.l d0/d2/a0-a1
  334.     bsr GWVA_RSC_PRG_RETURN_POSITIONS_CURSOR_TXT    ; -> retour dans d0, d1, d2
  335.     load.l d0/d2/a0-a1
  336.  
  337.     cmp.w d2,d1        ; d1.w : position max courante du curseur
  338.     bge.s .curseur_dans_le_champ
  339.  
  340.     cmp.w #4,GWVA_WFORM_OBJ_OBJC_EDIT_MODE
  341.     bne.s .pas_mode_speciale4_2
  342.     bset #2,GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE    ; sortie à droite
  343. .pas_mode_speciale4_2:
  344.  
  345.     move.w d1,d2    ; curseur au bout du champ de texte
  346. .curseur_dans_le_champ:
  347.  
  348.     cmp.w GWVA_WFORM_OBJ_CURSOR_POS_TEXT,d2
  349.     beq.s .pas_de_changement_position_curs
  350.  
  351.     cmp.w #4,GWVA_WFORM_OBJ_OBJC_EDIT_MODE
  352.     beq.s .pas_effacement_affichage_curseur
  353.  
  354.     save.l d0/d2/a0-a1
  355.     move.w GWVA_WFORM_OBJ_CURSOR_POS_TEXT,d2    ; position curseur à effacer
  356.     move.w #3,d3    ; on efface le curseur
  357.     bsr GWVA_WFORM_PRG_OBJC_EDIT
  358.     load.l d0/d2/a0-a1
  359.  
  360.     move.l te_ptext(a1),a3
  361.     add.w d2,a3
  362.     move.b (a3),-(sp)
  363.     clr.b (a3)        ; on met un 0.b pour placer le curseur ou l'on veut
  364.     save.l a3
  365.     move.w #1,d3    ; on affiche le curseur
  366.     bsr GWVA_WFORM_PRG_OBJC_EDIT
  367.     load.l a3
  368.     move.b (sp)+,(a3)
  369.  
  370.     move.w int_out+1*2,d2    ; nouvelle position du curseur
  371. .pas_effacement_affichage_curseur:
  372.  
  373. .pas_de_changement_position_curs:
  374.  
  375.     clr.w int_out+3*2
  376.     clr.w int_out+2*2
  377.     move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE,int_out+2*2+1
  378.     move.w d2,int_out+1*2
  379.     move.w #1,d0
  380.     move.w d0,int_out
  381.     rts
  382.  
  383.     *-----------------------*
  384.  
  385. .efface_curseur:
  386.     move.w d2,GWVA_WFORM_OBJ_CURSOR_POS_TEXT    ; position du curseur à effacer
  387.  
  388.     save.w d0        ; numero de l'objet
  389.     bsr GWVA_RSC_PRG_RETURN_POSITIONS_CURSOR_TXT    ; -> retour dans d0, d1, d2
  390.     bra.s .affiche_efface_curseur
  391.  
  392.     *-----------------------*
  393.  
  394. .affiche_curseur:
  395.     save.w d0        ; numéro de l'objet
  396.     bsr GWVA_RSC_PRG_RETURN_POSITIONS_CURSOR_TXT    ; -> retour dans d0, d1, d2
  397. ; d0 : position du curseur dans l'objet texte
  398. ; d1 : position du curseur dans le champ editable
  399. ; d2 : longueur du champ texte
  400.     move.w d0,GWVA_WFORM_OBJ_CURSOR_POS_TEXT    ; position du curseur à afficher
  401.  
  402. .affiche_efface_curseur:
  403.  
  404.     move.w GWVA_ROOT_SYSTEM_LARGEFONT_CELL_WIDTH,d3
  405.     move.w GWVA_ROOT_SYSTEM_LARGEFONT_CELL_HEIGHT,d4
  406.     cmp.w #5,te_font(a1)        ; small font ?
  407.     bne.s .pas_de_small_font
  408.     move.w GWVA_ROOT_SYSTEM_SMALLFONT_CELL_WIDTH,d3
  409.     move.w GWVA_ROOT_SYSTEM_SMALLFONT_CELL_HEIGHT,d4
  410. .pas_de_small_font:
  411.  
  412.     move.w GWVA_WFORM_OBJ_CURSOR_POS_TEXT,d0
  413.  
  414.     mulu d3,d0        ; position en x du curseur par rapport au début du texte
  415.     mulu d3,d2        ; taille du text en pixel
  416.  
  417.     load.w d5        ; numéro de l'objet texte
  418.  
  419.     save.l d0-d4/a0-a2
  420.     objc_offset a0,d5
  421.     load.l d0-d4/a0-a2
  422.  
  423.     move.w int_out+1*2,d5    ; position x de l'objet texte
  424.  
  425.     cmp.w #0,te_just(a1)    : justification gauche ?
  426.     beq.s .justified_left
  427.  
  428.     cmp.w #1,te_just(a1)    : justification droite ?
  429.     bne.s .not_justified_right
  430.  
  431.     move.w ob_width(a2),d6
  432.     sub.w d2,d6
  433.     add.w d6,d5
  434. .not_justified_right:
  435.  
  436.     cmp.w #2,te_just(a1)    : justification centrée ?
  437.     bne.s .not_justified_center
  438.  
  439.     move.w ob_width(a2),d6
  440.     sub.w d2,d6
  441.     asr.w #1,d6
  442.     add.w d6,d5
  443. .not_justified_center:
  444. .justified_left:
  445. ; -> d5 : position x du debut du texte en pixel
  446.  
  447.     move.w int_out+2*2,d6    ; position y de l'objet texte
  448.     move.w ob_height(a2),d7
  449.     sub.w d4,d7
  450.     asr.w #1,d7
  451.     add.w d7,d6
  452. ; -> d6 : position y du texte en pixel
  453.  
  454.     add.w d0,d5        ; position x du curseur
  455.     move.w d6,d7
  456.     sub.w #3,d6        ; position y1 du curseur
  457.     add.w d4,d7
  458.     add.w #2,d7        ; position y2 du curseur
  459.  
  460. ; Recherche du décalage 3D
  461.     cmp.w #$340,global+_AESversion
  462.     blt.s .pas_AES340
  463.  
  464.     move.w ob_flags(a2),d0
  465.     btst #9,d0
  466.     beq.s .pas_objet_indicateur_activateur
  467.  
  468.     save.w d1/d5-d7
  469.  
  470. ; On demande le nombre de pixel pour la 3D
  471.     objc_sysvar #0,#6,#0,#0
  472.     load.w d1/d5-d7
  473.     move.w int_out+1*2,d2
  474.     move.w int_out+2*2,d3
  475.     sub.w d2,d5        ; décalage du curseur en X (3D)
  476. *    sub.w d3,d6        ; décalage du curseur en Y (3D)
  477. *    sub.w d3,d7
  478.  
  479. .pas_objet_indicateur_activateur:
  480. .pas_AES340:
  481.  
  482.     ; position/taille bureau
  483.     movem.w ([GWVA_ROOT_PTR_WAPP.l],GWVA_WIND_OBJ_INT_DX),d0/d2/d3/d4
  484.     add.w d0,d3
  485.     add.w d2,d4
  486.     sub.w #1,d3
  487.     sub.w #1,d4
  488.  
  489.     cmp.w d0,d5
  490.     blt .a_gauche_bureau
  491.     cmp.w d3,d5
  492.     bgt .a_droite_bureau
  493.  
  494.     cmp.w d2,d7
  495.     blt .en_haut_bureau
  496.     cmp.w d4,d6
  497.     bgt .en_bas_bureau
  498.  
  499.     cmp.w d2,d6
  500.     bge .haut_curseur_dans_ecran
  501.     move.w d2,d6
  502. .haut_curseur_dans_ecran:
  503.     cmp.w d4,d7
  504.     ble .bas_curseur_dans_ecran
  505.     move.w d4,d7
  506. .bas_curseur_dans_ecran:
  507.  
  508.     save.w d1/d5-d7
  509.  
  510.     wind_update #BEG_UPDATE
  511.     graf_mouse #M_OFF
  512.  
  513.     vsl_type #0        ; plein
  514.     vsl_ends #0,#0    ; bouts carres
  515.     vsl_color #0    ; noir
  516.     vsl_width #1    ; taille 1
  517.     vswr_mode #3    ; xor
  518.     load.w d1/d5-d7
  519.  
  520.     move.w d5,ptsin+0*2
  521.     move.w d6,ptsin+1*2
  522.     move.w d5,ptsin+2*2
  523.     move.w d7,ptsin+3*2
  524.  
  525.     save.w d1
  526.     v_pline #2
  527.     graf_mouse #M_ON
  528.     wind_update #END_UPDATE
  529.     load.w d1
  530.  
  531. .a_gauche_bureau:
  532. .a_droite_bureau:
  533. .en_haut_bureau:
  534. .en_bas_bureau:
  535.  
  536.     move.w d1,int_out+1*2    ; position du curseur dans le champ texte
  537.  
  538.     move.w #1,d0
  539.     move.w d0,int_out
  540.     rts
  541.  
  542.  BSS
  543. GWVA_WFORM_OBJ_CURSOR_POS_TEXT:        ds.w 1
  544. GWVA_WFORM_OBJ_OBJC_EDIT_MODE:        ds.w 1
  545. GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE:    ds.b 1
  546. GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_CHAR:        ds.b 1
  547.  TEXT
  548.  
  549. ;-----------------------------------------------------------------------------
  550.  
  551. GWVA_WFORM_PRG_INSERT_CHAR_IN_EDITABLE_TEXT:
  552. ; a0.l : ptr sur l'objet GEM texte éditable
  553. ; d0.b : charactère ascii
  554. ; d1.w : position du curseur (insertion)
  555. ; d2.w : mode d'insertion (2 : identiqe GEM, 4 : mode étendu)
  556. ; -> d0.w : nouvelle position curseur
  557. ;    d1.w : état de sortie :    bit 0 : sortie caractère à droite,
  558. ;            bit 1 : rentrée caractère à droite,
  559. ;            bit 2 : sortie curseur à droite,
  560. ;            bit 3 : sortie curseur à gauche.
  561. ;    d2.w : caractère éventuel en sortie, 0.w sinon
  562. ;    d7.w : code d'erreur
  563.  
  564.     move.w d2,d3    ; sauve le mode d'insertion
  565.  
  566.     move.l ob_spec(a0),a1
  567.  
  568.     move.l te_ptext(a1),a2    ; le texte editable
  569.     move.l te_pvalid(a1),a3    ; la chaine de validité
  570.  
  571.     tst.w d1        ; d1.w : position du curseur
  572.     beq.s .curseur_debut_texte
  573.  
  574.     add.w d1,a2
  575.     add.w d1,a3
  576.  
  577.     move.w te_txtlen(a1),d2    ; d2.w : longueur max du texte + 0.b
  578.     sub.w #1,d2
  579.  
  580.     cmp.w d1,d2
  581.     bne.s .curseur_pas_en_fin_texte
  582.  
  583.     cmp.w #4,d3        ; pas d'insertion de caractère sur la dernière position d'un champ
  584.     beq .caractere_insere_sortie
  585.  
  586.     sub.w #1,d1
  587.     lea -1(a2),a2    ; si le curseur est en fin de texte (après le dernier
  588.     lea -1(a3),a3    ; caractère), on positione le curs. 1 char. avant
  589.  
  590. .curseur_pas_en_fin_texte:
  591. .curseur_debut_texte:
  592.  
  593. ; lors de l'appui sur une touche, si le caractère est le prochain caractère de
  594. ; la chaine de masque de texte, alors le texte editable est effacé jusqu'à ce texte
  595. ; non éditable
  596.  
  597.     move.b (a2),-(sp)    ; on veut le texte jusqu'au curseur
  598.     clr.b (a2)
  599.     save.l d0-d1/d3/a0-a3
  600.     bsr GWVA_RSC_PRG_RETURN_POSITIONS_CURSOR_TXT
  601.     move.w d0,d2    ; position du curseur dans l'objet texte
  602.     load.l d0-d1/d3/a0-a3
  603.     move.b (sp)+,(a2)
  604.  
  605.     lea GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT-2,a5
  606.     add.w d2,d2        ; [type de caractère,caractère]
  607.     add.w d2,a5        ; au niveau du curseur
  608.  
  609. .recherche_text_tmpl:
  610.     lea 2(a5),a5
  611.     cmp.b #'_',1(a5)
  612.     beq.s .recherche_text_tmpl
  613.  
  614.     tst.b 1(a5)
  615.     beq.s .pas_de_texte_non_editable    ; fin du texte ?
  616.  
  617.     cmp.b #'_',1+2(a5)        ; c'est la condition sine qua non
  618.     bne.s .pas_de_texte_editable_apres
  619.  
  620.     cmp.b 1(a5),d0
  621.     bne.s .pas_le_caractere_voulue
  622.  
  623.     sub.l #GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT,a5
  624.     move.w a5,d4
  625.     sub.w d2,d4            ; nombre de caractère à effacer
  626.     lsr #1,d4
  627.     sub.w #1,d4
  628.  
  629.     move.l te_ptext(a1),a3    ; le texte editable
  630.     add.w te_txtlen(a1),a3    ; longueur max du texte + 0.b
  631.     sub.w #1,a3
  632.  
  633. .efface_texte_editable:
  634.     cmp.l a2,a3
  635.     beq.s .fin_efface_texte_editable
  636.     move.b #' ',(a2)+
  637.     addq.w #1,d1
  638.     dbf d4,.efface_texte_editable
  639. .fin_efface_texte_editable:
  640.     clr.b (a2)
  641.     bra .insertion_espace        ; le caractère inséré ne tient pas
  642.                 ; compte du masque
  643. .pas_le_caractere_voulue:
  644. .pas_de_texte_editable_apres:
  645. .pas_de_texte_non_editable:
  646.  
  647.     clr.w d2
  648.     move.b d0,d2        ; d2.w caractère à insérer
  649.  
  650. ; On teste le caractère de validiter à l'emplacement d'insertion
  651.  
  652.     cmp.b #'9',(a3)
  653.     beq .digit
  654.  
  655.     cmp.b #'A',(a3)
  656.     beq .uppercase_letter
  657.  
  658.     cmp.b #'a',(a3)
  659.     beq .upper_lowercase_letter
  660.  
  661.     cmp.b #'N',(a3)
  662.     beq .digit_uppercase_letter
  663.  
  664.     cmp.b #'n',(a3)
  665.     beq .digit_upper_lowercase_letter
  666.  
  667.     cmp.b #'X',(a3)
  668.     beq .all_chars
  669.  
  670.     cmp.b #'z',d0
  671.     bgt .pas_change_lower_upper_name
  672.     cmp.b #'a',d0
  673.     blt.s .pas_change_lower_upper_name
  674.     and.b #$df,d0        ; les charactères GEMDOS sont majuscules
  675. .pas_change_lower_upper_name:
  676.  
  677.     cmp.b #'x',(a3)
  678.     beq .all_chars_in_upper
  679.  
  680.     cmp.b #'F',(a3)
  681.     beq .GEMDOS_name_1
  682.  
  683.     cmp.b #'f',(a3)
  684.     beq .GEMDOS_name_2
  685.  
  686.     cmp.b #'P',(a3)
  687.     beq .GEMDOS_pathname_1
  688.  
  689.     cmp.b #'p',(a3)
  690.     beq .GEMDOS_pathname_2
  691.  
  692.     bra .unknown_char
  693.  
  694. .all_chars_in_upper:
  695. .all_chars:        ; ce cas correspond à tous les caractères admissibles
  696.  
  697. .insere_chars:
  698.     move.w te_txtlen(a1),d2
  699.     sub.w #1,d2
  700.     beq .pas_insertion_chars    ; taille nulle du texte
  701.  
  702.     move.b (a2),d4        ; caractère à sauvegarder
  703.  
  704.     sub.w #1,d2
  705.     beq .insertion_un_seul_char    ; pas de décalage
  706.  
  707.     move.l te_ptext(a1),a3
  708.     add.w d2,a3        ; adresse de fin d'insertion
  709.     move.l a3,d2
  710.     sub.l a2,d2        ; nombre de caractère à décaler
  711.  
  712.     move.l te_ptext(a1),a4
  713.     STOP_ON_0 a4
  714.     sub.l te_ptext(a1),a4
  715.     move.w a4,d5
  716.     add.w #1,d5        ; longueur du texte éditable
  717.  
  718.     clr.w d4        ; pas de caractère en sortie
  719.  
  720.     cmp.w te_txtlen(a1),d5
  721.     bne.s .pas_de_sortie_caractere
  722.     move.b (a3),d4    ; caractère à sauvegarder
  723. .pas_de_sortie_caractere:
  724.  
  725.     sub.w #1,d2
  726.     bmi.s .pas_decalage_un_seul_char    ; condition jamais rencontrée
  727.  
  728. .decale_chars:
  729.     move.b -(a3),1(a3)
  730.     dbf d2,.decale_chars
  731.  
  732. .pas_decalage_un_seul_char:
  733. .insertion_un_seul_char:
  734.     move.b d0,(a2)
  735.     add.w #1,d1        ; position du curseur +1 : mais ne sort jamais
  736.  
  737. .insertion_espace:
  738.  
  739. *    cmp.w te_txtlen(a1),d1
  740. *    bne .curseur_pas_au_dela_texte    ; condition jamais rencontrée
  741. *    sub.w #1,d1
  742. *    bset #2,d2            ; le curseur sort à gauche
  743. *.curseur_pas_au_dela_texte
  744.  
  745.     move.w d1,d0
  746.     clr.w d1
  747.     clr.w d2
  748.  
  749.     cmp.w #4,d3
  750.     bne.s .pas_mode_speciale
  751.  
  752.     move.w d4,d2
  753.  
  754.     tst.w d2
  755.     beq.s .pas_de_caractere_sortie
  756.     bset #0,d1            ; caractère sortie à droite
  757. .pas_de_caractere_sortie:
  758.  
  759. .pas_mode_speciale:
  760.  
  761.     clr.w d7
  762.     rts
  763.  
  764. .pas_insertion_chars:
  765.     cmp.w #4,d3
  766.     bne.s .pas_insertion_chars2
  767.  
  768. .caractere_insere_sortie:
  769.     clr.w d2
  770.     move.b d0,d2    ; caractère sortie = caractère entré
  771.     move.w d1,d0    ; position curseur idem
  772.     clr.w d1
  773.     bset #0,d1        ; sortie caractère à droite
  774.     bset #2,d1        ; sortie curseur à gauche
  775.  
  776.     clr.w d7
  777.     rts
  778.     
  779. .pas_insertion_chars2:
  780. .chars_ne_correspond_pas:
  781. .unknown_char:
  782.     move.w d1,d0
  783.     clr.w d1
  784.     clr.w d2
  785.     move.w #GWVA_ERROR_GENERIC,d7
  786.     rts
  787.  
  788. .compare_char_table_admissible
  789.     tst.b (a5)
  790.     beq.s .chars_ne_correspond_pas
  791.  
  792.     cmp2.b (a5),d0
  793.     bcc .insere_chars
  794.     lea 1+1(a5),a5
  795.     bra.s .compare_char_table_admissible
  796.  
  797. .digit:    lea .table_digit(pc),a5
  798.     bra .compare_char_table_admissible
  799. .uppercase_letter:
  800.     lea .table_uppercase_letter(pc),a5
  801.     bra .compare_char_table_admissible
  802. .upper_lowercase_letter:
  803.     lea .table_upper_lowercase_letter(pc),a5
  804.     bra .compare_char_table_admissible
  805. .digit_uppercase_letter:
  806.     lea .table_digit_uppercase_letter(pc),a5
  807.     bra .compare_char_table_admissible
  808. .digit_upper_lowercase_letter:
  809.     lea .table_digit_upper_lowercase_letter(pc),a5
  810.     bra .compare_char_table_admissible
  811. .GEMDOS_name_1:
  812.     lea .table_GEMDOS_name_1(pc),a5
  813.     bra .compare_char_table_admissible
  814. .GEMDOS_name_2:
  815.     lea .table_GEMDOS_name_2(pc),a5
  816.     bra .compare_char_table_admissible
  817. .GEMDOS_pathname_1:
  818.     lea .table_GEMDOS_pathname_1(pc),a5
  819.     bra .compare_char_table_admissible
  820. .GEMDOS_pathname_2:
  821.     lea .table_GEMDOS_pathname_2(pc),a5
  822.     bra .compare_char_table_admissible
  823.  
  824. .table_digit:        dc.b '0','9',0
  825. .table_uppercase_letter:    dc.b ' ',' ','A','Z',0
  826. .table_upper_lowercase_letter:    dc.b ' ',' ','A','Z','a','z',0
  827. .table_digit_uppercase_letter:    dc.b ' ',' ','A','Z','0','9',0
  828. .table_digit_upper_lowercase_letter:    dc.b ' ',' ','A','Z','a','z','0','9',0
  829. .table_GEMDOS_name_1:        dc.b '!','-','0','[',']','~',0
  830. .table_GEMDOS_name_2:        dc.b '!',')','+','-','0','>','@','[',']','~',0
  831. .table_GEMDOS_pathname_1:    dc.b '!','-','0','~',0
  832. .table_GEMDOS_pathname_2:    dc.b '!',')','+','-','0','>','@','~',0
  833.  even
  834.